import { isDef, isNumber, isPlainObject, isPromise } from "./validator";
import { canIUseGroupSetData, canIUseNextTick, getSystemInfoSync } from "./version";
export { isDef } from "./validator";
export { getSystemInfoSync } from "./version";
export function range(num, min, max) {
	return Math.min(Math.max(num, min), max);
}
export function nextTick(cb) {
	if (canIUseNextTick()) {
		wx.nextTick(cb);
	} else {
		setTimeout(() => {
			cb();
		}, 1000 / 30);
	}
}
export function addUnit(value) {
	if (!isDef(value)) {
		return undefined;
	}
	value = String(value);
	return isNumber(value) ? `${value}px` : value;
}
export function requestAnimationFrame(cb) {
	return setTimeout(() => {
		cb();
	}, 1000 / 30);
}
export function pickExclude(obj, keys) {
	if (!isPlainObject(obj)) {
		return {};
	}
	return Object.keys(obj).reduce((prev, key) => {
		if (!keys.includes(key)) {
			prev[key] = obj[key];
		}
		return prev;
	}, {});
}
export function getRect(context, selector) {
	return new Promise(resolve => {
		wx.createSelectorQuery()
			.in(context)
			.select(selector)
			.boundingClientRect()
			.exec((rect = []) => resolve(rect[0]));
	});
}
export function getAllRect(context, selector) {
	return new Promise(resolve => {
		wx.createSelectorQuery()
			.in(context)
			.selectAll(selector)
			.boundingClientRect()
			.exec((rect = []) => resolve(rect[0]));
	});
}
export function groupSetData(context, cb) {
	if (canIUseGroupSetData()) {
		context.groupSetData(cb);
	} else {
		cb();
	}
}
export function toPromise(promiseLike) {
	if (isPromise(promiseLike)) {
		return promiseLike;
	}
	return Promise.resolve(promiseLike);
}
// 浮点数精度处理
export function addNumber(num1, num2) {
	const cardinal = Math.pow(10, 10);
	return Math.round((num1 + num2) * cardinal) / cardinal;
}
// 限制value在[min, max]之间
export const clamp = (num, min, max) => Math.min(Math.max(num, min), max);
export function getCurrentPage() {
	const pages = getCurrentPages();
	return pages[pages.length - 1];
}
export const isPC = ["mac", "windows"].includes(getSystemInfoSync().platform);
